#pragma once

#include <QObject>
#include <mutex>
#include <map>
#include <qbtools/message/MessagePoster.h>
#include <bondlib/BondInfo.h>

enum TipsDataType
{
	detailModel_BondDetail,  //债券信息
	//发行人
	detailModel_PublisherBasic,//发行人基本信息
};

enum CellBaseIndex
{
	Cell_FullName = 0,//债券全称
	Cell_Type,//类别
	Cell_Municipal,//是否城投
	Cell_DeadLine,//债券期限
	Cell_Size,//计划发行量；//////债券规模
	Cell_Opt,//含权类型
	Cell_RateType,//利率方式
	Cell_Ver,//主承销商
	Cell_Max,
};
//债券详情
enum CellMiniBaseIndex
{
	Cell_MiniFullName = 0,//债券全称
	Cell_MiniType,//类别
	Cell_MiniDeadLine,//债券期限
	Cell_MiniOption,//含权类型
	Cell_MiniCouponType,//利率方式
	Cell_MiniBaseRateName,//基础利率名
	Cell_MiniSize,//发行量；
	Cell_MiniCouponRate,//票面利率；
	Cell_MiniFrequency,//计息频率；
	Cell_MiniMunicipal,//是否城投
	Cell_MiniMax,
};

enum CellIssuerIndex
{
	Cell_Isu,//发行人主体
	Cell_IsuType,//主体类型
	Cell_FirstSector,//一级行业
	Cell_Province,//地区（省）
	Cell_ControlShare,//控股股东
	Cell_ShareRatio,//控股比例
	Cell_ActualControl,//实际控制人
	Cell_IsuMax,
};

enum emCrmColumBasic {
	bas_FullName = 0,          //  债券全称
	bas_BondType,				//债券类别
	bas_Term,						// 债券期限
	bas_Price,						//	信用保护费费率
	bas_PlanAmount,			//   计划创设额
	bas_FirstAmount,			//预配售额
	bas_SetModes,			   // 结算方式
	bas_Event,					  //	信用事件
	bas_Issuer,				  //  创设机构1
	bas_Max
};

enum emCrmColumRef {
	ref_reference = 0,	//参考实体
	ref_InstType,			//机构类型
	ref_FirSector,			//一级行业 }
	ref_SecSector,		//二级行业 }
	ref_City,				//地区(省) }
	ref_ActualCon,		//实际控制人 }
	ref_refBond,			//参考债券 }
	ref_refType,			//债券类别 }
	ref_refTerm,			//债券期限 }
	ref_refRate,			//票面利率 }
	ref_refAmount,		//发行量 }
	ref_Max
};

enum emCrmColumCal {
	cal_Start = 0,//簿记建档日
	cal_Register,//凭证登记日
	cal_Listed,//上市日 
	cal_Delisted,//下市日 
	cal_Payment,//信用保护费支付日 
	cal_InterestStart,//信用保护起始日 
	cal_MaturityDate,//信用保护到期日 		
	cal_Max
};

struct InfoCellData
{
	QString m_strName;
	QString m_strValue;
	QString m_strValueExp;
	int		m_colspan = 1;
};


class DetailTipsData : public QObject, public MessageReceiver
{
	Q_OBJECT
public:
	DetailTipsData(QObject* parent);
	~DetailTipsData();

	void* getData(const std::string&, TipsDataType type);

signals:
	void dataArrived(QString bondkey, int type);

protected:
	void reqData(const CBondInfo& bi, TipsDataType);
	void onDataArrived(const qb::SSAckMsg& msg) override;

private:
	std::map < const std::string, std::map<TipsDataType, void*> >	m_data;
	std::mutex		m_mutex;
};